library(pacman)
pacman::p_load(pheatmap, igraph, heatmaply)
library(igraph)
posTraits <- read.csv("~/Google Drive/Volumes/Research Project/Trait Network_Behaviral/generating network/output/allPosCents.csv")
negTraits <- read.csv("~/Google Drive/Volumes/Research Project/Trait Network_Behaviral/generating network/output/allNegCents.csv")

posDf <- read.csv("~/Google Drive/Volumes//Research Project/Trait Network_Behaviral/generating network/output/adjacencyMatrix_p.csv")
posMat <- as.matrix(posDf)
posGraph <- graph.adjacency(posMat)

negDf <- read.csv("~/Google Drive/Volumes//Research Project/Trait Network_Behaviral/generating network/output/adjacencyMatrix_n.csv")
negMat <- as.matrix(negDf)
negGraph <- graph.adjacency(negMat)

simPos <- as.matrix(similarity.dice(posGraph))
colnames(simPos) <- posTraits$trait
rownames(simPos) <- posTraits$trait
outphm<-pheatmap(simPos, fontsize_row = 6, fontsize_col = 6, angle_col = 45, angle_row =45, width=100, height = 200 )
heatmaply(normalize(simPos), Rowv=outphm[[1]], Colv=outphm[[2]], revC=TRUE, fontsize_row = 2, fontsize_col = 2, angle_col = 45, angle_row =45,  limits = c(-1, 1), colors = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100) )
words <- c("Sociable","Fun","Witty","Smart","Knowledgeable","Talkative","Disciplined","Extraverted","Charming","Studious","Level-headed","Mature")
test <- simPos[words,words]
library(pheatmap)
outphm<-pheatmap(test, fontsize_row = 6, fontsize_col = 6, angle_col = 45, angle_row =45, width=100, height = 200 )


ggheatmap(
normalize(test), Rowv=outphm[[1]], Colv=outphm[[2]], revC=TRUE, fontsize_row = 12, fontsize_col = 12, angle_col = 45, angle_row =45,  limits = c(-1, 1), colors = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100)
)
ggsave("~/Desktop/posSimMat.png",height=6,width=8,units = "in")


heatmaply(normalize(test), Rowv=outphm[[1]], Colv=outphm[[2]], revC=TRUE, fontsize_row = 12, fontsize_col = 12, angle_col = 45, angle_row =45,  limits = c(-1, 1), colors = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100) )
words <- c("Sociable","Fun","Witty","Smart","Knowledgeable","Talkative","Disciplined","Extraverted","Charming","Studious","Level-headed","Mature")
subsetSimPos <- simPos[words,words]

outgoingwords <-c("Witty","Fun","Sociable","Talkative","Extraverted","Charming")
disciplinewords <- setdiff(words,outgoingwords)

pheatmap(subsetSimPos, fontsize_row = 12, fontsize_col = 12, angle_col = 90, angle_row =45,  limits = c(0, 1), color = colorRampPalette((brewer.pal(n = 7, name =
  "YlOrRd")))(100), border_color = NA, legend=F, treeheight_col=0, treeheight_row=0, file="~/Desktop/test.png")
words <- c("Sociable","Fun","Witty","Smart","Knowledgeable","Talkative","Disciplined","Extraverted","Charming","Studious","Level-headed","Mature")
subsetSimPos <- simPos[words,words]

outgoingwords <-c("Witty","Fun","Sociable","Talkative","Extraverted","Charming")
disciplinewords <- setdiff(words,outgoingwords)

# colnames(subsetSimPos)[which(colnames(subsetSimPos)%in%outgoingwords)] <- paste0(colnames(subsetSimPos)[which(colnames(subsetSimPos)%in%outgoingwords)], " - [68% GP]")
# rownames(subsetSimPos)[which(rownames(subsetSimPos)%in%outgoingwords)] <- paste0(rownames(subsetSimPos)[which(rownames(subsetSimPos)%in%outgoingwords)], " - [68% GP]")
# 
# colnames(subsetSimPos)[which(colnames(subsetSimPos)%in%disciplinewords)] <- paste0(colnames(subsetSimPos)[which(colnames(subsetSimPos)%in%disciplinewords)], " - [32% GP]")
# rownames(subsetSimPos)[which(rownames(subsetSimPos)%in%disciplinewords)] <- paste0(rownames(subsetSimPos)[which(rownames(subsetSimPos)%in%disciplinewords)], " - [32% GP]")

colnames(subsetSimPos)[which(colnames(subsetSimPos)%in%outgoingwords)] <-  " "

colnames(subsetSimPos)[which(colnames(subsetSimPos)%in%disciplinewords)] <- " "

pheatmap(subsetSimPos, fontsize_row = 12, fontsize_col = 12, angle_col = 0, angle_row =45,  limits = c(0, 1), color = colorRampPalette((brewer.pal(n = 7, name =
  "YlOrRd")))(100), border_color = NA, legend=F, treeheight_col=0, treeheight_row=0, file="~/Desktop/test.png")
V(posGraph)$Names <- posTraits$trait
 
outgoingwords <-c("Witty","Fun","Sociable","Talkative","Extraverted","Charming")
disciplinewords <- setdiff(words,outgoingwords)
V(posGraph)$group[which(V(posGraph)$Names%in%outgoingwords)] <- "Low GN"
V(posGraph)$group[which(V(posGraph)$Names%in%disciplinewords)] <- "High GN"

V(posGraph)$Names2[which(V(posGraph)$Names%in%outgoingwords)] <- paste0(outgoingwords,"\n32% GP")#"Low GN"
V(posGraph)$Names2[which(V(posGraph)$Names%in%disciplinewords)] <- paste0(disciplinewords,"\n68% GP")#"High GN"



#FriendlyNet <- ego(subTFGraph.55520, order = 1, nodes = 6, mode = "out",
#  mindist = 0)
subNet <- induced.subgraph(posGraph, vids = which(V(posGraph)$Names%in%c(outgoingwords,disciplinewords)) )

set.seed(2)

library(GGally)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
plotOutdegree <- ggnet2(subNet, alpha = 0.75, size = "outdegree", color = "phono", edge.color = "grey", edge.alpha = 0.25, mode = "kamadakawai", layout.exp = .35, directed = TRUE) + 
  guides(color = FALSE, size = FALSE) + geom_text(aes(label = V(subNet)$Names), size = 3.5)
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
plotOutdegree

set.seed(52)
ggnet2(subNet, directed=TRUE, arrow.size = 3.5, arrow.gap = 0.05, layout.exp = .65, alpha = 1, size = "outdegree", color = "group", palette = "Set2", edge.color = "black", edge.alpha = .75, mode = "fruchtermanreingold", directed = TRUE) + 
  guides(color = FALSE, size = FALSE) + geom_text(aes(label = V(subNet)$Names2), size = 4)
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.


mds.sim <- (1 - simPos) %>%
  cmdscale() %>%
  as_tibble()
Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
Using compatibility `.name_repair`.
inds <- c(which(colnames(simPos)%in%outgoingwords), which(colnames(simPos)%in%disciplinewords))

colnames(mds.sim) <- c("Dim.1", "Dim.2")
ggscatter(mds.sim[inds,], x = "Dim.1", y = "Dim.2", 
          size = 1,
          label = colnames(simPos)[inds],
          repel = TRUE) + xlab("More Group Probable") + ylab("More Group Probable")


library(grid) 
g <- rasterGrob(blues9, width=unit(1,"npc"), height = unit(1,"npc"), 
interpolate = TRUE) 
ggscatter(mds.sim[inds,], x = "Dim.1", y = "Dim.2", 
          size = 1,
          label = colnames(simPos)[inds],
          repel = TRUE) + xlab("Group Characteristics") + ylab("Group Characteristics") +
  scale_x_continuous(breaks = seq(from=-.3,to=.3,by=.3), labels=c("32% Group Probability", "0% Group Probability", "68% Group Probability")) +
    scale_y_continuous(breaks = seq(from=-.5,to=.2,by=.35), labels=c("32% Group Probability", "0% Group Probability", "68% Group Probability"))

#trsup <- data.frame(x=c(-2,-2,2), y=c(-2,2,2))
#trinf <- data.frame(x=c(-2,2,2), y=c(-2,-2,2))

#mds.simZ <- as.data.frame(scale(mds.sim))
mds.simRS <- mds.sim
mds.simRS$Dim.1 <- scales::rescale(mds.sim$Dim.1, to=c(-1,1))
mds.simRS$Dim.2 <- scales::rescale(mds.sim$Dim.2, to=c(-1,1))


trinf <- data.frame(x=c(-5,5,5), y=c(5,5,-5))
trsup <- -trinf

df <- data.frame(x = sample(1:100, 100, replace = FALSE), y = sample(1:100, 100, replace=FALSE))

ggscatter(mds.simRS[inds,], x = "Dim.1", y = "Dim.2", 
          size = 1,
          label = colnames(simPos)[inds],
          repel = TRUE) + geom_polygon(aes(x=x,y=y), data = trsup, fill= "dodgerblue3", alpha = .4) + geom_polygon(aes(x=x,y=y), data = trinf, fill = "#FF000066", alpha = .4) + coord_cartesian(xlim=c(-1.5,1.5), ylim=c(-1.5,1.5)) + xlab("Categories") + ylab("Categories") +
  scale_x_continuous(breaks = seq(from=-1,to=1,by=1), labels=c("Social", " ", "Studious")) +
    scale_y_continuous(breaks = seq(from=-1,to=1,by=1), labels=c("Social", " ", "Studious"))

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkocGFjbWFuKQpwYWNtYW46OnBfbG9hZChwaGVhdG1hcCwgaWdyYXBoLCBoZWF0bWFwbHksIFJDb2xvckJyZXdlciwgdGlkeXZlcnNlLCBnZ3B1YnIpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGlncmFwaCkKcG9zVHJhaXRzIDwtIHJlYWQuY3N2KCJ+L0dvb2dsZSBEcml2ZS9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvVHJhaXQgTmV0d29ya19CZWhhdmlyYWwvZ2VuZXJhdGluZyBuZXR3b3JrL291dHB1dC9hbGxQb3NDZW50cy5jc3YiKQpuZWdUcmFpdHMgPC0gcmVhZC5jc3YoIn4vR29vZ2xlIERyaXZlL1ZvbHVtZXMvUmVzZWFyY2ggUHJvamVjdC9UcmFpdCBOZXR3b3JrX0JlaGF2aXJhbC9nZW5lcmF0aW5nIG5ldHdvcmsvb3V0cHV0L2FsbE5lZ0NlbnRzLmNzdiIpCgpwb3NEZiA8LSByZWFkLmNzdigifi9Hb29nbGUgRHJpdmUvVm9sdW1lcy8vUmVzZWFyY2ggUHJvamVjdC9UcmFpdCBOZXR3b3JrX0JlaGF2aXJhbC9nZW5lcmF0aW5nIG5ldHdvcmsvb3V0cHV0L2FkamFjZW5jeU1hdHJpeF9wLmNzdiIpCnBvc01hdCA8LSBhcy5tYXRyaXgocG9zRGYpCnBvc0dyYXBoIDwtIGdyYXBoLmFkamFjZW5jeShwb3NNYXQpCgpuZWdEZiA8LSByZWFkLmNzdigifi9Hb29nbGUgRHJpdmUvVm9sdW1lcy8vUmVzZWFyY2ggUHJvamVjdC9UcmFpdCBOZXR3b3JrX0JlaGF2aXJhbC9nZW5lcmF0aW5nIG5ldHdvcmsvb3V0cHV0L2FkamFjZW5jeU1hdHJpeF9uLmNzdiIpCm5lZ01hdCA8LSBhcy5tYXRyaXgobmVnRGYpCm5lZ0dyYXBoIDwtIGdyYXBoLmFkamFjZW5jeShuZWdNYXQpCgpzaW1Qb3MgPC0gYXMubWF0cml4KHNpbWlsYXJpdHkuZGljZShwb3NHcmFwaCkpCmNvbG5hbWVzKHNpbVBvcykgPC0gcG9zVHJhaXRzJHRyYWl0CnJvd25hbWVzKHNpbVBvcykgPC0gcG9zVHJhaXRzJHRyYWl0CmBgYAoKCmBgYHtyfQpvdXRwaG08LXBoZWF0bWFwKHNpbVBvcywgZm9udHNpemVfcm93ID0gNiwgZm9udHNpemVfY29sID0gNiwgYW5nbGVfY29sID0gNDUsIGFuZ2xlX3JvdyA9NDUsIHdpZHRoPTEwMCwgaGVpZ2h0ID0gMjAwICkKaGVhdG1hcGx5KG5vcm1hbGl6ZShzaW1Qb3MpLCBSb3d2PW91dHBobVtbMV1dLCBDb2x2PW91dHBobVtbMl1dLCByZXZDPVRSVUUsIGZvbnRzaXplX3JvdyA9IDIsIGZvbnRzaXplX2NvbCA9IDIsIGFuZ2xlX2NvbCA9IDQ1LCBhbmdsZV9yb3cgPTQ1LCAgbGltaXRzID0gYygtMSwgMSksIGNvbG9ycyA9IGNvbG9yUmFtcFBhbGV0dGUocmV2KGJyZXdlci5wYWwobiA9IDcsIG5hbWUgPQogICJSZFlsQnUiKSkpKDEwMCkgKQpgYGAKCmBgYHtyfQp3b3JkcyA8LSBjKCJTb2NpYWJsZSIsIkZ1biIsIldpdHR5IiwiU21hcnQiLCJLbm93bGVkZ2VhYmxlIiwiVGFsa2F0aXZlIiwiRGlzY2lwbGluZWQiLCJFeHRyYXZlcnRlZCIsIkNoYXJtaW5nIiwiU3R1ZGlvdXMiLCJMZXZlbC1oZWFkZWQiLCJNYXR1cmUiKQp0ZXN0IDwtIHNpbVBvc1t3b3Jkcyx3b3Jkc10KbGlicmFyeShwaGVhdG1hcCkKb3V0cGhtPC1waGVhdG1hcCh0ZXN0LCBmb250c2l6ZV9yb3cgPSA2LCBmb250c2l6ZV9jb2wgPSA2LCBhbmdsZV9jb2wgPSA0NSwgYW5nbGVfcm93ID00NSwgd2lkdGg9MTAwLCBoZWlnaHQgPSAyMDAgKQoKZ2doZWF0bWFwKApub3JtYWxpemUodGVzdCksIFJvd3Y9b3V0cGhtW1sxXV0sIENvbHY9b3V0cGhtW1syXV0sIHJldkM9VFJVRSwgZm9udHNpemVfcm93ID0gMTIsIGZvbnRzaXplX2NvbCA9IDEyLCBhbmdsZV9jb2wgPSA0NSwgYW5nbGVfcm93ID00NSwgIGxpbWl0cyA9IGMoLTEsIDEpLCBjb2xvcnMgPSBjb2xvclJhbXBQYWxldHRlKHJldihicmV3ZXIucGFsKG4gPSA3LCBuYW1lID0KICAiUmRZbEJ1IikpKSgxMDApCikKZ2dzYXZlKCJ+L0Rlc2t0b3AvcG9zU2ltTWF0LnBuZyIsaGVpZ2h0PTYsd2lkdGg9OCx1bml0cyA9ICJpbiIpCgpoZWF0bWFwbHkobm9ybWFsaXplKHRlc3QpLCBSb3d2PW91dHBobVtbMV1dLCBDb2x2PW91dHBobVtbMl1dLCByZXZDPVRSVUUsIGZvbnRzaXplX3JvdyA9IDEyLCBmb250c2l6ZV9jb2wgPSAxMiwgYW5nbGVfY29sID0gNDUsIGFuZ2xlX3JvdyA9NDUsICBsaW1pdHMgPSBjKC0xLCAxKSwgY29sb3JzID0gY29sb3JSYW1wUGFsZXR0ZShyZXYoYnJld2VyLnBhbChuID0gNywgbmFtZSA9CiAgIlJkWWxCdSIpKSkoMTAwKSApCmBgYAoKYGBge3J9CndvcmRzIDwtIGMoIlNvY2lhYmxlIiwiRnVuIiwiV2l0dHkiLCJTbWFydCIsIktub3dsZWRnZWFibGUiLCJUYWxrYXRpdmUiLCJEaXNjaXBsaW5lZCIsIkV4dHJhdmVydGVkIiwiQ2hhcm1pbmciLCJTdHVkaW91cyIsIkxldmVsLWhlYWRlZCIsIk1hdHVyZSIpCnN1YnNldFNpbVBvcyA8LSBzaW1Qb3Nbd29yZHMsd29yZHNdCgpvdXRnb2luZ3dvcmRzIDwtYygiV2l0dHkiLCJGdW4iLCJTb2NpYWJsZSIsIlRhbGthdGl2ZSIsIkV4dHJhdmVydGVkIiwiQ2hhcm1pbmciKQpkaXNjaXBsaW5ld29yZHMgPC0gc2V0ZGlmZih3b3JkcyxvdXRnb2luZ3dvcmRzKQoKcGhlYXRtYXAoc3Vic2V0U2ltUG9zLCBmb250c2l6ZV9yb3cgPSAxMiwgZm9udHNpemVfY29sID0gMTIsIGFuZ2xlX2NvbCA9IDkwLCBhbmdsZV9yb3cgPTQ1LCAgbGltaXRzID0gYygwLCAxKSwgY29sb3IgPSBjb2xvclJhbXBQYWxldHRlKChicmV3ZXIucGFsKG4gPSA3LCBuYW1lID0KICAiWWxPclJkIikpKSgxMDApLCBib3JkZXJfY29sb3IgPSBOQSwgbGVnZW5kPUYsIHRyZWVoZWlnaHRfY29sPTAsIHRyZWVoZWlnaHRfcm93PTAsIGZpbGU9In4vRGVza3RvcC90ZXN0LnBuZyIpCmBgYAoKCmBgYHtyfQp3b3JkcyA8LSBjKCJTb2NpYWJsZSIsIkZ1biIsIldpdHR5IiwiU21hcnQiLCJLbm93bGVkZ2VhYmxlIiwiVGFsa2F0aXZlIiwiRGlzY2lwbGluZWQiLCJFeHRyYXZlcnRlZCIsIkNoYXJtaW5nIiwiU3R1ZGlvdXMiLCJMZXZlbC1oZWFkZWQiLCJNYXR1cmUiKQpzdWJzZXRTaW1Qb3MgPC0gc2ltUG9zW3dvcmRzLHdvcmRzXQoKb3V0Z29pbmd3b3JkcyA8LWMoIldpdHR5IiwiRnVuIiwiU29jaWFibGUiLCJUYWxrYXRpdmUiLCJFeHRyYXZlcnRlZCIsIkNoYXJtaW5nIikKZGlzY2lwbGluZXdvcmRzIDwtIHNldGRpZmYod29yZHMsb3V0Z29pbmd3b3JkcykKCiMgY29sbmFtZXMoc3Vic2V0U2ltUG9zKVt3aGljaChjb2xuYW1lcyhzdWJzZXRTaW1Qb3MpJWluJW91dGdvaW5nd29yZHMpXSA8LSBwYXN0ZTAoY29sbmFtZXMoc3Vic2V0U2ltUG9zKVt3aGljaChjb2xuYW1lcyhzdWJzZXRTaW1Qb3MpJWluJW91dGdvaW5nd29yZHMpXSwgIiAtIFs2OCUgR1BdIikKIyByb3duYW1lcyhzdWJzZXRTaW1Qb3MpW3doaWNoKHJvd25hbWVzKHN1YnNldFNpbVBvcyklaW4lb3V0Z29pbmd3b3JkcyldIDwtIHBhc3RlMChyb3duYW1lcyhzdWJzZXRTaW1Qb3MpW3doaWNoKHJvd25hbWVzKHN1YnNldFNpbVBvcyklaW4lb3V0Z29pbmd3b3JkcyldLCAiIC0gWzY4JSBHUF0iKQojIAojIGNvbG5hbWVzKHN1YnNldFNpbVBvcylbd2hpY2goY29sbmFtZXMoc3Vic2V0U2ltUG9zKSVpbiVkaXNjaXBsaW5ld29yZHMpXSA8LSBwYXN0ZTAoY29sbmFtZXMoc3Vic2V0U2ltUG9zKVt3aGljaChjb2xuYW1lcyhzdWJzZXRTaW1Qb3MpJWluJWRpc2NpcGxpbmV3b3JkcyldLCAiIC0gWzMyJSBHUF0iKQojIHJvd25hbWVzKHN1YnNldFNpbVBvcylbd2hpY2gocm93bmFtZXMoc3Vic2V0U2ltUG9zKSVpbiVkaXNjaXBsaW5ld29yZHMpXSA8LSBwYXN0ZTAocm93bmFtZXMoc3Vic2V0U2ltUG9zKVt3aGljaChyb3duYW1lcyhzdWJzZXRTaW1Qb3MpJWluJWRpc2NpcGxpbmV3b3JkcyldLCAiIC0gWzMyJSBHUF0iKQoKY29sbmFtZXMoc3Vic2V0U2ltUG9zKVt3aGljaChjb2xuYW1lcyhzdWJzZXRTaW1Qb3MpJWluJW91dGdvaW5nd29yZHMpXSA8LSAgIiAiCgpjb2xuYW1lcyhzdWJzZXRTaW1Qb3MpW3doaWNoKGNvbG5hbWVzKHN1YnNldFNpbVBvcyklaW4lZGlzY2lwbGluZXdvcmRzKV0gPC0gIiAiCgpwaGVhdG1hcChzdWJzZXRTaW1Qb3MsIGZvbnRzaXplX3JvdyA9IDEyLCBmb250c2l6ZV9jb2wgPSAxMiwgYW5nbGVfY29sID0gMCwgYW5nbGVfcm93ID00NSwgIGxpbWl0cyA9IGMoMCwgMSksIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZSgoYnJld2VyLnBhbChuID0gNywgbmFtZSA9CiAgIllsT3JSZCIpKSkoMTAwKSwgYm9yZGVyX2NvbG9yID0gTkEsIGxlZ2VuZD1GLCB0cmVlaGVpZ2h0X2NvbD0wLCB0cmVlaGVpZ2h0X3Jvdz0wLCBmaWxlPSJ+L0Rlc2t0b3AvdGVzdC5wbmciKQpgYGAKCmBgYHtyfQpWKHBvc0dyYXBoKSROYW1lcyA8LSBwb3NUcmFpdHMkdHJhaXQKIApvdXRnb2luZ3dvcmRzIDwtYygiV2l0dHkiLCJGdW4iLCJTb2NpYWJsZSIsIlRhbGthdGl2ZSIsIkV4dHJhdmVydGVkIiwiQ2hhcm1pbmciKQpkaXNjaXBsaW5ld29yZHMgPC0gc2V0ZGlmZih3b3JkcyxvdXRnb2luZ3dvcmRzKQpWKHBvc0dyYXBoKSRncm91cFt3aGljaChWKHBvc0dyYXBoKSROYW1lcyVpbiVvdXRnb2luZ3dvcmRzKV0gPC0gIkxvdyBHTiIKVihwb3NHcmFwaCkkZ3JvdXBbd2hpY2goVihwb3NHcmFwaCkkTmFtZXMlaW4lZGlzY2lwbGluZXdvcmRzKV0gPC0gIkhpZ2ggR04iCgpWKHBvc0dyYXBoKSROYW1lczJbd2hpY2goVihwb3NHcmFwaCkkTmFtZXMlaW4lb3V0Z29pbmd3b3JkcyldIDwtIHBhc3RlMChvdXRnb2luZ3dvcmRzLCJcbjMyJSBHUCIpIyJMb3cgR04iClYocG9zR3JhcGgpJE5hbWVzMlt3aGljaChWKHBvc0dyYXBoKSROYW1lcyVpbiVkaXNjaXBsaW5ld29yZHMpXSA8LSBwYXN0ZTAoZGlzY2lwbGluZXdvcmRzLCJcbjY4JSBHUCIpIyJIaWdoIEdOIgoKCgojRnJpZW5kbHlOZXQgPC0gZWdvKHN1YlRGR3JhcGguNTU1MjAsIG9yZGVyID0gMSwgbm9kZXMgPSA2LCBtb2RlID0gIm91dCIsCiMgIG1pbmRpc3QgPSAwKQpzdWJOZXQgPC0gaW5kdWNlZC5zdWJncmFwaChwb3NHcmFwaCwgdmlkcyA9IHdoaWNoKFYocG9zR3JhcGgpJE5hbWVzJWluJWMob3V0Z29pbmd3b3JkcyxkaXNjaXBsaW5ld29yZHMpKSApCgpzZXQuc2VlZCgyKQoKbGlicmFyeShHR2FsbHkpCnBsb3RPdXRkZWdyZWUgPC0gZ2duZXQyKHN1Yk5ldCwgYWxwaGEgPSAwLjc1LCBzaXplID0gIm91dGRlZ3JlZSIsIGNvbG9yID0gInBob25vIiwgZWRnZS5jb2xvciA9ICJncmV5IiwgZWRnZS5hbHBoYSA9IDAuMjUsIG1vZGUgPSAia2FtYWRha2F3YWkiLCBsYXlvdXQuZXhwID0gLjM1LCBkaXJlY3RlZCA9IFRSVUUpICsgCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UsIHNpemUgPSBGQUxTRSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gVihzdWJOZXQpJE5hbWVzKSwgc2l6ZSA9IDMuNSkKcGxvdE91dGRlZ3JlZQpgYGAKCgpgYGB7cn0Kc2V0LnNlZWQoNTIpCmdnbmV0MihzdWJOZXQsIGRpcmVjdGVkPVRSVUUsIGFycm93LnNpemUgPSAzLjUsIGFycm93LmdhcCA9IDAuMDUsIGxheW91dC5leHAgPSAuNjUsIGFscGhhID0gMSwgc2l6ZSA9ICJvdXRkZWdyZWUiLCBjb2xvciA9ICJncm91cCIsIHBhbGV0dGUgPSAiU2V0MiIsIGVkZ2UuY29sb3IgPSAiYmxhY2siLCBlZGdlLmFscGhhID0gLjc1LCBtb2RlID0gImZydWNodGVybWFucmVpbmdvbGQiLCBkaXJlY3RlZCA9IFRSVUUpICsgCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UsIHNpemUgPSBGQUxTRSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gVihzdWJOZXQpJE5hbWVzMiksIHNpemUgPSA0KQpgYGAKCgpgYGB7cn0KCm1kcy5zaW0gPC0gKDEgLSBzaW1Qb3MpICU+JQogIGNtZHNjYWxlKCkgJT4lCiAgYXNfdGliYmxlKCkKCmluZHMgPC0gYyh3aGljaChjb2xuYW1lcyhzaW1Qb3MpJWluJW91dGdvaW5nd29yZHMpLCB3aGljaChjb2xuYW1lcyhzaW1Qb3MpJWluJWRpc2NpcGxpbmV3b3JkcykpCgpjb2xuYW1lcyhtZHMuc2ltKSA8LSBjKCJEaW0uMSIsICJEaW0uMiIpCmdnc2NhdHRlcihtZHMuc2ltW2luZHMsXSwgeCA9ICJEaW0uMSIsIHkgPSAiRGltLjIiLCAKICAgICAgICAgIHNpemUgPSAxLAogICAgICAgICAgbGFiZWwgPSBjb2xuYW1lcyhzaW1Qb3MpW2luZHNdLAogICAgICAgICAgcmVwZWwgPSBUUlVFKSArIHhsYWIoIk1vcmUgR3JvdXAgUHJvYmFibGUiKSArIHlsYWIoIk1vcmUgR3JvdXAgUHJvYmFibGUiKQoKbGlicmFyeShncmlkKSAKZyA8LSByYXN0ZXJHcm9iKGJsdWVzOSwgd2lkdGg9dW5pdCgxLCJucGMiKSwgaGVpZ2h0ID0gdW5pdCgxLCJucGMiKSwgCmludGVycG9sYXRlID0gVFJVRSkgCmdnc2NhdHRlcihtZHMuc2ltW2luZHMsXSwgeCA9ICJEaW0uMSIsIHkgPSAiRGltLjIiLCAKICAgICAgICAgIHNpemUgPSAxLAogICAgICAgICAgbGFiZWwgPSBjb2xuYW1lcyhzaW1Qb3MpW2luZHNdLAogICAgICAgICAgcmVwZWwgPSBUUlVFKSArIHhsYWIoIkdyb3VwIENoYXJhY3RlcmlzdGljcyIpICsgeWxhYigiR3JvdXAgQ2hhcmFjdGVyaXN0aWNzIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbT0tLjMsdG89LjMsYnk9LjMpLCBsYWJlbHM9YygiMzIlIEdyb3VwIFByb2JhYmlsaXR5IiwgIjAlIEdyb3VwIFByb2JhYmlsaXR5IiwgIjY4JSBHcm91cCBQcm9iYWJpbGl0eSIpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKGZyb209LS41LHRvPS4yLGJ5PS4zNSksIGxhYmVscz1jKCIzMiUgR3JvdXAgUHJvYmFiaWxpdHkiLCAiMCUgR3JvdXAgUHJvYmFiaWxpdHkiLCAiNjglIEdyb3VwIFByb2JhYmlsaXR5IikpCmBgYAoKYGBge3J9CiN0cnN1cCA8LSBkYXRhLmZyYW1lKHg9YygtMiwtMiwyKSwgeT1jKC0yLDIsMikpCiN0cmluZiA8LSBkYXRhLmZyYW1lKHg9YygtMiwyLDIpLCB5PWMoLTIsLTIsMikpCgojbWRzLnNpbVogPC0gYXMuZGF0YS5mcmFtZShzY2FsZShtZHMuc2ltKSkKbWRzLnNpbVJTIDwtIG1kcy5zaW0KbWRzLnNpbVJTJERpbS4xIDwtIHNjYWxlczo6cmVzY2FsZShtZHMuc2ltJERpbS4xLCB0bz1jKC0xLDEpKQptZHMuc2ltUlMkRGltLjIgPC0gc2NhbGVzOjpyZXNjYWxlKG1kcy5zaW0kRGltLjIsIHRvPWMoLTEsMSkpCgoKdHJpbmYgPC0gZGF0YS5mcmFtZSh4PWMoLTUsNSw1KSwgeT1jKDUsNSwtNSkpCnRyc3VwIDwtIC10cmluZgoKZGYgPC0gZGF0YS5mcmFtZSh4ID0gc2FtcGxlKDE6MTAwLCAxMDAsIHJlcGxhY2UgPSBGQUxTRSksIHkgPSBzYW1wbGUoMToxMDAsIDEwMCwgcmVwbGFjZT1GQUxTRSkpCgpnZ3NjYXR0ZXIobWRzLnNpbVJTW2luZHMsXSwgeCA9ICJEaW0uMSIsIHkgPSAiRGltLjIiLCAKICAgICAgICAgIHNpemUgPSAxLAogICAgICAgICAgbGFiZWwgPSBjb2xuYW1lcyhzaW1Qb3MpW2luZHNdLAogICAgICAgICAgcmVwZWwgPSBUUlVFKSArIGdlb21fcG9seWdvbihhZXMoeD14LHk9eSksIGRhdGEgPSB0cnN1cCwgZmlsbD0gImRvZGdlcmJsdWUzIiwgYWxwaGEgPSAuNCkgKyBnZW9tX3BvbHlnb24oYWVzKHg9eCx5PXkpLCBkYXRhID0gdHJpbmYsIGZpbGwgPSAiI0ZGMDAwMDY2IiwgYWxwaGEgPSAuNCkgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbT1jKC0xLjUsMS41KSwgeWxpbT1jKC0xLjUsMS41KSkgKyB4bGFiKCJDYXRlZ29yaWVzIikgKyB5bGFiKCJDYXRlZ29yaWVzIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbT0tMSx0bz0xLGJ5PTEpLCBsYWJlbHM9YygiU29jaWFsIiwgIiAiLCAiU3R1ZGlvdXMiKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcShmcm9tPS0xLHRvPTEsYnk9MSksIGxhYmVscz1jKCJTb2NpYWwiLCAiICIsICJTdHVkaW91cyIpKQpgYGAKCgo=